#中间件
from django.http import JsonResponse
from django.shortcuts import redirect, HttpResponse, render
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings

#把用户的session数据拆分到类，方便使用
class UserInfo:
    def __init__(self,role,name,id):
        self.id = id #id
        self.name = name #名字
        self.role = role #用户角色
        self.menu_name = None #菜单路径
        self.text_list = []  # 路径导航


# 实现是否登录校验
class AuthMiddleware(MiddlewareMixin):
    #白名单函数
    def is_white_url(self,request):
        if request.path_info in settings.NB_WHITE_URL:
            return True
        else:
            return False

    def process_request(self, request):
        """
        :param request: 作用：用户是否已经登录
        :return:
        """
        # 预置条件 优先处理不需要登录就能访问的地址 防止没有权限导致死循环持续访问登录
        if self.is_white_url(request):
            return

        #1 获取session中的用户信息，获取不到表示未登录 让他回登录页面
        user_dict= request.session.get(settings.NB_SESSIONKET) #获取session
        print("获取session",user_dict)
        if not user_dict: #未登录
            return redirect(settings.NB_LOGIN_URL) #回到登录界面

        # 登录了
        # 在request放用户登录的相关信息，方便后续使用  request.nb_user.id;request.nb_user.name调用
        request.nb_user = UserInfo(**user_dict)
        print("中间件打印用户信息",request.nb_user.name)
        if request.path_info == "/":
            return redirect(settings.LOGIN_HOME)
        return

    #权限校验
    def process_view(self,request, view_func,view_args,view_kwargs):
        print(request, view_func,view_args,view_kwargs)
        # 预置条件 优先处理不需要登录就能访问的地址 防止需要取用户信息时报错
        if self.is_white_url(request):
            return
        # 2获取访问的URL 的name
        current_name = request.resolver_match.url_name
        print(current_name)
        #优先判断是否是公共的url
        if current_name in settings.NB_PERMISSION_PUBLIC:
            return None


        #1依据用户获取应该有的权限
        user_permission_dict = settings.NB_PERMISSION[request.nb_user.role]
        print("依据用户获取应该有的权限",user_permission_dict)

        #3是否有权限 没有直接返回
        if current_name not in user_permission_dict:
            # 无权访问 如果是ajax请求 返回json 如果是form表单 返回界面
            print("请求是ajax？",request.is_ajax())
            if request.is_ajax():
                return JsonResponse({"status":False,"detail":"无权访问"})
            else:
                return render(request, "permission.html")
        #4，有权限 放行
        text_list = []

        # 添加一个当前访问的文本
        text_list.append(user_permission_dict[current_name]["text"])
        # 找父亲:实现访问子页面时，关联的左边的父亲菜单需要被选中。
        menu_name = current_name # 访问的URL
        # 当parent有值 表示为根目录的子级，没有值表示为根目录
        while user_permission_dict[menu_name]["parent"]:
            #把找到的上级赋值给menu_name 再重新找 一直找到根目录 退出
            menu_name = user_permission_dict[menu_name]["parent"]
            #把父亲的文本也放到list
            text_list.append(user_permission_dict[menu_name]["text"])
        text_list.append("首页")
        text_list.reverse() #反转列表

        # print("menu_name",menu_name)
        #保存当前菜单的根用于web默认选中的样式
        request.nb_user.menu_name = menu_name
        # 保存路径列表到request
        request.nb_user.text_list = text_list
        return None